package servlets;

import garbagecollect.Adresse;
import garbagecollect.PMF;
import garbagecollect.UtilAdresse;
import garbagecollect.Utilisateur;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Logger;

import javax.jdo.PersistenceManager;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import abstractClasses.CsvDownload;
import abstractClasses.TransformationString;

import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;


/**
 *
 * Cette servlet est la servlet principale de l'application
 * C'est ici que se gèrent toutes les redirections et les traitements associés à chaque action possible dans l'application
 */
public class GarbageCollectServlet extends HttpServlet
{
	private static final Logger log = Logger.getLogger(GarbageCollectServlet.class.getName());

	@Override
	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws IOException, ServletException
	{
		req.setCharacterEncoding("UTF-8");
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html; charset=utf-8");
		
		UserService userService = UserServiceFactory.getUserService();
		User user = userService.getCurrentUser();
		HttpSession session = req.getSession(true);
		String pathInfo = req.getPathInfo();
		PersistenceManager pm = PMF.get().getPersistenceManager();
				
		if (pathInfo.equals("/start")) {
			String nom = req.getParameter("nom");
			String prenom = req.getParameter("prenom");
			Utilisateur util = new Utilisateur(user.getEmail(), nom, prenom);
			session.setAttribute("utilisateur", util);
			try {
				pm.makePersistent(util);
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {}
			RequestDispatcher rd = getServletContext().getRequestDispatcher("/consult.jsp");
			rd.forward(req, resp);
		}
		else if (pathInfo.equals("/ajouter")) {
			String sAdresse = TransformationString.oterLesAccents(req.getParameter("choixAdresse")).toUpperCase().toLowerCase();
			String sLocation = "", sErrorMessage = null;

			String query = "select from " + Adresse.class.getName() + " where libelle == '" + sAdresse + "'";
			List<Adresse> listAdresses = (List<Adresse>) pm.newQuery(query).execute();
			
			//	On vérifie si l'adresse figure déjà en base
			if(listAdresses.isEmpty()) {
				
				//	Elle n'y figure pas, on télécharge dans la base de la ville de Nantes
				int idAdresse = CsvDownload.downloadAndMatchData(sAdresse, pm);
				
				if(idAdresse != 0) {
					UtilAdresse ua = new UtilAdresse(user.getEmail(), idAdresse);
					try {
						pm.makePersistent(ua);
						Thread.sleep(5000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					finally { }
					sLocation = "/consult.jsp";
				}
				else {
					req.setAttribute("sErrorMessage", "L'adresse ne figure pas dans nos fichiers");
					sLocation = "/newadress.jsp";
				}
			}
			else if (listAdresses.size() == 1) {
				Iterator<Adresse> itAdresses = listAdresses.iterator();
				Adresse a = itAdresses.next();
				UtilAdresse ua = new UtilAdresse(user.getEmail(), a.getIdAdresse());
				try {
					pm.makePersistent(ua);
					Thread.sleep(5000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				finally { }
				sLocation = "/consult.jsp";
			}
			
			RequestDispatcher rd = getServletContext().getRequestDispatcher(sLocation);
			rd.forward(req, resp);
		}
		else if (pathInfo.equals("/supprimer"))
		{
			String[] listecheck = req.getParameterValues("supprimer[]");
			if (listecheck!=null)
			{
				//	On supprime uniquement les instances de UtilAdresse pour l'utilisateur courant
				for (int i = 0; i < listecheck.length; i++)
				{
					String query = "select from " + UtilAdresse.class.getName() + " where idAdresse == " + listecheck[i] + " && mailUtil == '" + user.getEmail() + "'";
					List<UtilAdresse> uadresses = (List<UtilAdresse>) pm.newQuery(query).execute();
					Iterator<UtilAdresse> iter = uadresses.iterator();
					
					UtilAdresse ua = iter.next();
					try
					{
						pm.deletePersistent(ua);
						Thread.sleep(5000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					finally {}
				}
			}
			RequestDispatcher rd = getServletContext().getRequestDispatcher("/consult.jsp");
			rd.forward(req, resp);
		}
	}
}